package Facade

import "fmt"

/**
[外观模式](http://c.biancheng.net/view/1369.html)
- 是一种通过为多个复杂的子系统提供一个一致的接口，而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口，外部应用程序不用关心内部子系统的具体细节，这样会大大降低应用程序的复杂度，提高了程序的可维护性。
*/

type CarModel struct {
}

func NewCarModel() *CarModel {
	return &CarModel{}
}

func (m *CarModel) SetCarModel() {
	fmt.Println("CarModel--SetCarModel")
}

type CarEngine struct {
}

func NewCarEngine() *CarEngine {
	return &CarEngine{}
}
func (e *CarEngine) SetCarEngine() {
	fmt.Println("CarEngine--SetCarEngine")
}

type CarBody struct {
}

func NewCarBody() *CarBody {
	return &CarBody{}
}
func (b *CarBody) SetCarBody() {
	fmt.Println("CarBody--SetCarBody")
}

type CarFacade struct {
	model  CarModel
	engine CarEngine
	body   CarBody
}

func NewCarFacade() *CarFacade {
	return &CarFacade{
		model:  CarModel{},
		engine: CarEngine{},
		body:   CarBody{},
	}
}
func (c *CarFacade) CreateCompleteCar() {
	c.model.SetCarModel()
	c.engine.SetCarEngine()
	c.body.SetCarBody()
}
